
//重写解密方法，实现RSA公钥解密，原jsencrypt不支持公钥解密
import JSEncrypt from 'jsencrypt'
import { parseBigInt } from 'jsencrypt/lib/lib/jsbn/jsbn'


function pkcs1unpad2(d, n) {
	var b = d.toByteArray()
	var i = 0
	while (i < b.length && b[i] === 0) {
		++i
	}
	++i
	while (b[i] !== 0) {
		if (++i >= b.length) {
			return null
		}
	}
	var ret = ''
	while (++i < b.length) {
		var c = b[i] & 255
		if (c < 128) { // utf-8 decode
			ret += String.fromCharCode(c)
		} else if ((c > 191) && (c < 224)) {
			ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63))
				++i
		} else {
			ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63))
			i += 2
		}
	}
	return ret
}
/**
 * 公钥解密方法
 * @param {string} data 需要解密的内容
 * @param {string} publicKey 用于解密的公钥
 */
export function decryptByPublicKey(data, publicKey) {
	const encrypt = new JSEncrypt()
	encrypt.setPublicKey(publicKey)
	// 自定义解析方法支持公钥解析
	const rsaKey = encrypt.getKey()
	rsaKey.decrypt = function(ctext) {
		var c = parseBigInt(ctext, 16)
		var m = this.doPublic(c)
		if (m == null) {
			return null
		}
		return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3)
	}
	return encrypt.decrypt(data)
}